/**
 * 第i种猫粮有Ai值与Bi数量，每一天都会将现存的所有猫粮每种吃一个
 * Q个询问，问k天内的最大值是多少？
 * 假设数据是
 * 3 7 5
 * 1 3 1
 * 则第1天有3种猫粮，值为15
 * 第2天只剩1种猫粮，值为7
 * 第3天只剩1种猫粮，值为7
 * 再累加起来可以求出k天以内的最大值
 */
#include <bits/stdc++.h>
using namespace std;

using llt = long long;
using vi = vector<int>;
using pii = pair<int, int>;
using pll = pair<llt, llt>;

llt const INF = 0x1F2F3F4F5F6F7F8F;

int N;
int Q;
vector<pll> Vec;
vector<pll> Sum;
vector<llt> T;
vector<llt> D;

llt proc(int k){
    auto p = equal_range(T.begin(), T.end(), k);
    int pos = p.first - T.begin();
    
    auto ans = D[pos - 1];
    llt unit = Sum[pos - 1].first;
    llt cha = k - T[pos - 1];
    if(pos + 1 == T.size()) cha = 0;
    ans += cha * unit;
    return ans;
}

void work(){
    cin >> N;
    Vec.assign(N, {});
    
    for(auto & p : Vec) cin >> p.first;
    for(auto & p : Vec) cin >> p.second;

    sort(Vec.begin(), Vec.end(), [](const pll & a, const pll & b){
        if(a.second != b.second) return a.second < b.second;
        return a.first < b.first;
    });

    Sum.assign(N + 1, {0LL, 0LL});
    for(int i=N-1;i>=0;--i){
        Sum[i].second = Vec[i].second;
        Sum[i].first = Vec[i].first + Sum[i + 1].first;
    }    
    Sum[N] = {0, INF};
    Sum.erase(unique(Sum.begin(), Sum.end(), [](const pii & a, const pll & b){
        return a.second == b.second;
    }), Sum.end());

    D.assign(Sum.size() + 1, 0);
    T.assign(Sum.size() + 1, 0);
    for(int i=0;i<Sum.size();++i){        
        T[i + 1] = Sum[i].second;
        D[i + 1] = Sum[i].first * (T[i + 1] - T[i]) + D[i];
    }

    cin >> Q;
    for(int k,q=1;q<=Q;++q){
        cin >> k;
        if(k > *----T.end()) k = *----T.end();
        cout << proc(k) << "\n";
    }
    return;
}

int main(){
#ifndef ONLINE_JUDGE
    freopen("z.txt", "r", stdin);
#endif
    ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);

    int nofkase = 1;
    // cin >> nofkase;
    while(nofkase--) work();
    return 0;
}
